package com.freeleaps.devops

import com.freeleaps.devops.enums.SASTScannerTypes
import com.freeleaps.devops.sast.SASTScanner
import com.freeleaps.devops.sast.Bandit

/**
 * SAST表示安全代码扫描
 * SAST (Static Application Security Testing) 执行器类
 * 负责根据不同的扫描器类型执行静态应用安全测试
 * SAST是一种在代码不运行的情况下分析源代码以发现安全漏洞的技术
 * 支持多种安全扫描器：Bandit (Python)、SonarQube、Checkmarx等
 * 提供统一的安全扫描接口，确保代码的安全性
 */
class SASTExecutor {
  // Jenkins Pipeline的steps对象，用于调用Jenkins内置功能
  def steps
  // 工作空间路径，安全扫描的目标目录
  def workspace
  // SAST扫描器类型（Bandit、SonarQube等）
  def scannerType

  /**
   * 构造函数
   * @param steps Jenkins Pipeline的steps对象
   * @param workspace 工作空间路径
   * @param scannerType SAST扫描器类型
   */
  SASTExecutor(steps, workspace, scannerType) {
    this.steps = steps
    this.workspace = workspace
    this.scannerType = scannerType
  }

  /**
   * 执行SAST安全扫描的主要方法
   * 根据配置的扫描器类型，创建相应的扫描器实例并执行安全扫描
   * 扫描器会分析源代码中的安全漏洞、潜在风险和最佳实践违规
   */
  def execute() {
    // 创建SAST扫描器实例
    SASTScanner scanner

    // 根据扫描器类型创建对应的扫描器实例
    switch (scannerType) {
      case SASTScannerTypes.BANDIT:
        // 创建Bandit扫描器实例
        // Bandit是Python代码的静态安全分析工具
        // 用于检测Python代码中的安全漏洞和潜在风险
        // 支持检测：硬编码密码、SQL注入、XSS、不安全的随机数等
        scanner = new Bandit(steps, workspace)
        break
      default:
        // 不支持的SAST扫描器类型
        // 需要插件：Pipeline Plugin (基础插件) - 提供steps.error功能
        steps.error("Unsupported SAST scanner type: ${scannerType}")
        return
    }

    // 执行安全扫描
    // 调用具体扫描器的scan方法，执行实际的安全漏洞检测
    // 扫描结果通常包括：漏洞类型、严重程度、文件位置、修复建议等
    scanner.scan()
  }
}